<?php
class UserRegistrarDatosReservaController extends GenericController {

    private $generarListadoBO; 
    private $procesarFichaBO;
    private $procesarReservaBO;
    private $consultaLolimsaBO;
    private $visaNetBO;

    public function __construct() {
        $this->className = 'UserRegistrarDatosReservaController';
        LogUtil::info("class $this->className", "__construct");
        $this->generarListadoBO = BOFactory::getGenerarListadoBO();
        $this->procesarFichaBO = BOFactory::getProcesarFichaBO();
        $this->procesarReservaBO = BOFactory::getProcesarReservaBO();
        $this->consultaLolimsaBO = BOFactory::getConsultaLolimsaBO(); 
        $this->visaNetBO = BOFactory::getVisaNetBO();
    }

    public function __destruct() {
        LogUtil::info("class $this->className", "__destruct");
    }

    public function main() {
        LogUtil::info("class $this->className", "main"); 
        $paginaDestino = "";
        if(isset($_POST["guardarFicha"])){     
            $this->messages = new WP_Error();            
            ValidadorUtil::validarComboVacio($this->messages, "cbxMedico",  Constantes::$MSJ_ERROR_MEDICO_VACIO);            
            ValidadorUtil::validarTextoVacio($this->messages, "txtNombre",  Constantes::$MSJ_ERROR_NOMBRE_VACIO);            
            ValidadorUtil::validarTextoVacio($this->messages, "txtFecha",  Constantes::$MSJ_ERROR_FECHA_VACIO);  
            if(isset($_POST["txtFecha"]))ValidadorUtil::validarFechaLaboralSeleccionada ($this->messages, 'txtFecha', Constantes::$MSJ_ERROR_FECHA_INVALIDA);
            ValidadorUtil::validarComboVacio($this->messages, "cbxHorario",  Constantes::$MSJ_ERROR_HORA_VACIO);            
            ValidadorUtil::validarTextoVacio($this->messages, "txtEmail",  Constantes::$MSJ_ERROR_MAIL_VACIO);
            if(isset($_POST["txtEmail"]))ValidadorUtil::validarTipoDatoInput($this->messages, 'txtEmail', 'email', Constantes::$MSJ_ERROR_MAIL_INVALIDO);
            ValidadorUtil::validarTextoVacio($this->messages, "txtTelefono",  Constantes::$MSJ_ERROR_TELEFONO_VACIO);            
            ValidadorUtil::validarTextoVacio($this->messages, "txtDni",  Constantes::$MSJ_ERROR_DNI_VACIO);  
            if(isset($_POST["txtDni"]))ValidadorUtil::validarTipoDatoInput($this->messages, 'txtDni', 'numerico', Constantes::$MSJ_ERROR_DNI_INVALIDO);
            ValidadorUtil::validarTextoVacio($this->messages, "txtaRazon",  Constantes::$MSJ_ERROR_RAZON_VACIO);            
            
            if(ValidadorUtil::is_empty_error($this->messages) ){ 
                try{
                    $ficha = $this->cargarModelFicha();
                    //1. verificamos si la ficha a crear es valida entre las fichas existentes
                    if(!$this->verificarFichaValidaEnSISRES($ficha)){  
                        $paginaDestino = Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO1;
                    }
                    else{ 
                        //2. verificamos si la ficha a crear es valida entre la citas de LOLCLI
                        if(!$this->verificarFichaValidaEnLOLCLI($ficha,1)){
                           $paginaDestino = Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO1; 
                        }
                        else {
                            $res = $this->procesarFichaBO->guardarFicha($ficha);
                            if($res>0){
                                $ficha = $this->procesarFichaBO->obtenerFichaPorId($res);
                                //ponemos en sesion el id de la fiche generada
                                $_POST['idFicha'] = $ficha->id;
                                //adicionamos datos de la cita
                                $_POST["txtMonto"] = $this->procesarFichaBO->obtenerDatosMedicoConsultaPorIdMedico($ficha->Medico_id)->monto;
                                $_POST["txtNombreMedico"] = $this->procesarFichaBO->obtenerDatosMedicoConsultaPorIdMedico($ficha->Medico_id)->descripcion;
                                $_POST["txtHoraCita"] = $this->procesarFichaBO->obtenerDatosHorarioConsultaPorIdHorario($ficha->Horario_id)->descripcion;
                                $paginaDestino = Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO2;
                            }else{
                                LogUtil::debug("class ".$this->className, "NO OBTENEMOS LA FICHA");
                                Util::agregarError($this->messages, "error", Constantes::$MSJ_ERROR_RETORNO_DATOS_BD);  
                                $paginaDestino = Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO1;
                            }
                        }
                    }  
                }catch(Exception $e){                    
                    Util::agregarError($this->messages, $e->getCode(),$e->getMessage());                    
                }
            }else{
                 $paginaDestino = Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO1;
            }
            
        //luego del paso 2    
        }else if(isset($_POST["guardarReserva"])){
            $this->messages = new WP_Error();            
            //ValidadorUtil::validarComboVacio($this->messages, "cbxTipoTarjeta",  Constantes::$MSJ_ERROR_TIPO_TARJETA_VACIO);            
            ValidadorUtil::validarCasillaVerificacionMarcada($this->messages, "checkboxOk", Constantes::$MSJ_ERROR_TERMINOS_CONDICIONES_VACIO);
            
            if(ValidadorUtil::is_empty_error($this->messages) ){              
                
                try{
                    $ficha = $this->procesarFichaBO->obtenerFichaPorId(RenderUtil::getValue('idFicha'));
                    //1. verificamos si la ficha a registrar en reserva es valida entre las fichas existentes
                    if(!$this->verificarFichaValidaEnSISRES($ficha)){  
                        $paginaDestino = Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO1;
                    }
                    else{ 
                        //2. verificamos si la ficha a registrar en reserva es valida entre la citas de LOLCLI
                        if(!$this->verificarFichaValidaEnLOLCLI($ficha,2)){
                           $paginaDestino = Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO1; 
                        }
                        else {
                            if(RenderUtil::getValue('cbxTipoTarjeta') == '1'){
                                //3. verificacion los casos de prevencion de fraude
                                if(!$this->verificarReservaValidaPasarelaPagoVisa()){
                                    $paginaDestino = Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO2; 
                                }
                                else {
                                    //se crea el registro en la reserva en estado pendiente de confirmacion
                                    $reserva = new Reserva();
                                    $reserva->Ficha_id = $ficha->id;   
                                    $reserva->Tipo_Tarjeta_id = RenderUtil::getValue('cbxTipoTarjeta');   
                                    $reserva->cod_generado = str_pad($reserva->Ficha_id, 9, "0", STR_PAD_LEFT);  
                                    $medicoAux = new Medico;
                                    $medicoAux = $this->procesarReservaBO->obtenerMedicoPorId($ficha->Medico_id);
                                    $reserva->monto_cobrado = $medicoAux->monto;
                                    $eticket_visa = $this->visaNetBO->generarETicket($reserva->cod_generado, number_format($reserva->monto_cobrado, 2, ".", ","), "clinica morillas");
                                    $reserva->eticket_visa = $eticket_visa->eTicket;
                                    $resReserva = $this->procesarReservaBO->guardarReserva($reserva);
                                    if($resReserva>0){
                                        $reserva = $this->procesarReservaBO->obtenerReservaPorId($resReserva);
                                        //ponemos en sesion el id de la fiche generada
                                        //adicionamos datos del pago
                                        $_POST['ETICKET'] = $reserva->eticket_visa;
                                        $opcion = $this->procesarReservaBO->obtenerOpcionPorId(Constantes::$OPCION_URL_PAGO_VISA);
                                        $_POST["VISANET_URL"] = $opcion->valor;
                                        $paginaDestino = Constantes::$PAGE_PASARELA_PAGO_VISA;
                                    }else{
                                        Util::agregarError($this->messages, "error", Constantes::$MSJ_ERROR_RETORNO_DATOS_BD);  
                                        $paginaDestino = Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO1;
                                    }
                                }

                            }/*else{
                                $paginaDestino = Constantes::$PAGE_PASARELA_PAGO_MASTERCARD;
                            }*/
                        }
                    }  
                }catch(Exception $e){                    
                    Util::agregarError($this->messages, 'error',$e->getMessage()); 
                    $paginaDestino =  Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO2;
                }
              }else{                
                $paginaDestino =  Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO2;
            }
        //si en el paso 2, decide cancelar    
        }else if(isset($_POST["volverFicha"])){
            $paginaDestino =  Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO1;
        }else{
            try {
                $opcion = $this->procesarReservaBO->obtenerOpcionPorId(Constantes::$OPCION_ACCESO_SISTEMA); 
                if($opcion->valor==0){
                    $paginaDestino =  Constantes::$PAGE_USER_REGISTRAR_RESERVA_SIN_ACCESO;
                }else{
                    $paginaDestino =  Constantes::$PAGE_USER_REGISTRAR_RESERVA_PASO1;
                }
            }catch(Exception $e){                    
                Util::agregarError($this->messages, $e->getCode(),$e->getMessage()); 
                $paginaDestino =  Constantes::$PAGE_USER_REGISTRAR_RESERVA_SIN_ACCESO;
            }
        }
        
        return $paginaDestino;
    }
    
    public function verificarFichaValidaEnSISRES($ficha){
        LogUtil::info("class ".$this->className, "verificarFichaValidaEnSISRES");
        try{
            $retorno = $this->procesarFichaBO->verificarFichaValidaEnSISRES($ficha);
            if($retorno['esValido']){
                return true;
            }else{   
                switch ($retorno['motivo']) {
                    case EstadoFichaType::Procesando :
                        Util::agregarError($this->messages, "error",Constantes::$MSJ_ERROR_FICHA_PROCESANDO); 
                        break;
                    case EstadoFichaType::Reservada :
                        Util::agregarError($this->messages, "error",Constantes::$MSJ_ERROR_FICHA_RESERVADA); 
                        break;
                    default:
                        break;
                }           
            }        
            return false;
        }catch(Exception $e){                    
            Util::agregarError($this->messages, $e->getCode(),$e->getMessage()); 
            return false;
        }        
    }
    
    public function verificarFichaValidaEnLOLCLI($ficha,$paso){
        LogUtil::info("class ".$this->className, "verificarFichaValidaEnLOLCLI");
        $flagCitaValida = false;  
        try{
            $res = $this->consultaLolimsaBO->getToken();
            $token = $res->token;
            $codEstablecimiento = Constantes::$CODIGO_ESTABLECIMIENTO_CLINICA_LOLIMSA;
            $medico = new Medico();
            $medico = $this->procesarFichaBO->obtenerMedicoPorId($ficha->Medico_id);
            $horario = new Horario();
            $horario = $this->procesarFichaBO->obtenerHorarioPorId($ficha->Horario_id);
            $codServicio = $medico->codServLolimsa;
            $codMedico = $medico->codLolimsa;
            $fecha = null;
            //$fecha = date("Ymd",strtotime($ficha->fecha_cita));
            if($paso==1){
                $date = DateTime::createFromFormat('d/m/Y', $ficha->fecha_cita);
                $fecha = $date->format('Ymd');
            }else{
                $fecha = date("Ymd",strtotime($ficha->fecha_cita));
            }            
            $citas = $this->consultaLolimsaBO->GetScheduleDetail($token, $codEstablecimiento, $codServicio, $codMedico, $fecha);
            foreach ($citas->cita as $cita) {
               if($cita->horario == $horario->codLolimsa && $cita->tipoDisponibilidad == Constantes::$INDICADOR_DISPONIBILIDAD_CITA_LOLIMSA){
                   $flagCitaValida = true;
                   break;
               }
            }
            if(!$flagCitaValida) Util::agregarError($this->messages, "error",  Constantes::$MSJ_ERROR_CITA_RESERVADA_LOLIMSA);
            return $flagCitaValida;
        }catch(Exception $e){                    
            Util::agregarError($this->messages, $e->getCode(),$e->getMessage()); 
             return false;
        }  
    }
    
     public function verificarReservaValidaPasarelaPagoVisa(){
        $flagReservaValida = true;  
        //por implementar-----!
        return $flagReservaValida;
    }
    
    public function obtenerListadoMedicosOption($nombreComponente){
        LogUtil::info("class ".$this->className, "obtenerListadoMedicosOption");
        $medicos = $this->generarListadoBO->retornarListado(Constantes::$TIPO_LISTADO_MEDICOS_ACTIVOS);
        foreach ($medicos as $medico) {
           RenderUtil::mostrarOptionMedico($medico->id,$medico->descripcion,$medico->monto,$nombreComponente);
        }
    }
    
    public function obtenerListadoHorariosOption($nombreComponente){
        LogUtil::info("class ".$this->className, "obtenerListadoHorariosOption");
        $horarios = $this->generarListadoBO->retornarListado(Constantes::$TIPO_LISTADO_HORARIOS_ACTIVOS);
        foreach ($horarios as $horario) {
            RenderUtil::mostrarOption($horario->id,$horario->descripcion,$nombreComponente);
        }
    }
    
    public function obtenerListadoTipoTarjetasOption($nombreComponente){
        LogUtil::info("class ".$this->className, "obtenerListadoTipoTarjetasOption");
        $tipoTarjetas = $this->generarListadoBO->retornarListado(Constantes::$TIPO_LISTADO_TIPO_TARJETA_ACTIVOS);
        foreach ($tipoTarjetas as $tipoTarjeta) {
            RenderUtil::mostrarOption($tipoTarjeta->id,$tipoTarjeta->descripcion,$nombreComponente);
        }
    }
    
    public function cargarModelFicha(){
        LogUtil::info("class $this->className", "cargarModelFicha");
        $ficha = new Ficha();
        $ficha->Medico_id = $_POST["cbxMedico"];   
        $ficha->Horario_id = $_POST["cbxHorario"];    
        $ficha->nombre = $_POST["txtNombre"];    
        $ficha->email = $_POST["txtEmail"];    
        $ficha->telefono = $_POST["txtTelefono"];    
        $ficha->dni = $_POST["txtDni"];  
        $ficha->fecha_cita = $_POST["txtFecha"]; 
        $ficha->motivo = $_POST['txtaRazon']; 
        //$ficha->estado = EstadoFichaType::Creada; 
        $ficha->ip = $_SERVER['REMOTE_ADDR'];   
        $ficha->token = 'token generado';
        return $ficha;
    }
}
?>